﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NHibernate;
using NHibernate.Criterion;

namespace Soyuz.ProgramacionWCF.Persistencia
{
    public class BaseDAO<Entidad, Id, Fecha, Origen, Destino, Cantidad>
    {
        public Entidad Crear(Entidad entidad)
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                sesion.Save(entidad);
                sesion.Flush();
            }
            return entidad;
        }
        public Entidad Obtener(Id id)
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                return sesion.Get<Entidad>(id);
            }
        }
        public Entidad Modificar(Entidad entidad)
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                sesion.Update(entidad);
                sesion.Flush();
            }
            return entidad;
        }
        public void Eliminar(Entidad entidad)
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                sesion.Delete(entidad);
                sesion.Flush();
            }
        }
        public ICollection<Entidad> Consultar(Fecha fechainicial, Fecha fechafinal,Origen origen, Destino destino, Cantidad cantidad)
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                ICriteria busqueda = sesion.CreateCriteria(typeof(Entidad))
                //.Add(Restrictions.Eq("Fecha", fecha))
                .Add(Restrictions.Between("Fecha", fechainicial, fechafinal))
                .Add(Restrictions.Eq("Origen", origen))
                .Add(Restrictions.Eq("Destino", destino))
                .Add(Restrictions.Ge("Stock", cantidad));
                return busqueda.List<Entidad>();
            }
        }

        public ICollection<Entidad> ListarTodos()
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                ICriteria busqueda = sesion.CreateCriteria(typeof(Entidad));
                return busqueda.List<Entidad>();
            }
        }

    }
}